import React from "react";
import BaseComp from "./BaseComp";
import PropTypes from "prop-types";

/**
 * 表格组件的基类。
 * 用于定义表格组件通用的 属性 和 方法；
 */
export default class AbstractDataGrid extends BaseComp {

    static propTypes = {
        ...BaseComp.propTypes,
        /**
         * 表格数据
         */
        dataSource: PropTypes.arrayOf(PropTypes.object),
        /**
         * 列配置
         */
        columns: PropTypes.arrayOf(PropTypes.object),
        /**
         * 是否需要“序号”列
         */
        needNO: PropTypes.bool,
        /**
         * 是否显示左侧 checkbox
         */
        rowSelect: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
        /**
         * 汇总数据；每一列的字段名与 columns 的 dataIndex 对应
         */
        sumData: PropTypes.arrayOf(PropTypes.object),
    };

    moreCommonProps() {
        return [...super.moreCommonProps(),
            'needNO', 'rowSelect', 'sumData'
        ]
    }

    /**
     * 设置表格数据
     * @param data
     * @param afterCb
     * @param reMountTable {boolean} 是否需要重载 Table。默认 false
     * @param isInit {boolean} 是否初始化，如果是，则添加 defaultRowCnt 相关逻辑
     */
    setData(data, afterCb, reMountTable = false, isInit = false) {
    }

    /**
     * 获取表格数据
     * @param onlyChange {boolean} 是否只获取改变了的数据。默认 true
     * @return {undefined|{comboVal, compVal}|[]}
     */
    getData(onlyChange = true) {
        return this.getAjaxData(onlyChange);
    }

    /**
     * 获取表格数据（等同于 getData 方法）
     * @param onlyChange {boolean} 是否只获取改变了的数据。默认 true
     * @return {undefined|{comboVal, compVal}|[]}
     */
    getAjaxData(onlyChange = true) {
    }

    /**
     * 获取不为空的数据
     * @param onlyChange {boolean} 是否只获取改变了的数据。默认 false
     * @return {*[]}
     */
    getDataNoEmpty(onlyChange = true) {
        return this.getAjaxData(onlyChange);
    }

    /**
     * 获取删除了的记录
     * @param fullRecord {boolean} 是否需要返回完整的记录。默认 false，只返回删除了的 id 数组
     * @return {[]}
     */
    getDeleted(fullRecord = false) {
    }

    /**
     * 获取选中的记录
     * @param fullRecord {boolean} 是否需要返回完整的记录。默认 true。否则只返回的 id 数组
     * @return {[]}
     */
    getSelected(fullRecord = true) {
    }

    /**
     * “表格-列渲染”
     * @type {{}}
     */
    colRenders = {};

    /**
     * 设置“表格-列渲染”
     * @param dataIndex {string}
     * @param render {function(value: any, record: {}, rowIndex: number)}
     */
    setColRender(dataIndex, render) {
        this.colRenders[dataIndex] = render;
    }

    /**
     * 表格的“行-事件处理函数”
     * @type {{onClick?: function({record: {key: string, id: number}}), onDoubleClick?:function({record: {key: string, id: number}})}}
     */
    rowHandlers = {};

    /**
     * 设置“表格-行-事件响应”
     * @param handlers {{onClick?: function({record: {key: string, id: number}}), onDoubleClick?:function({record: {key: string, id: number}})}}
     * @param isWholeObject Boolean 是否重新设置整个 rowHandlers 对象，默认 false
     *                      true: 以 handlers 重新设置 rowHandlers ;
     *                      false: 保留原有设置，只做部分替换;
     */
    setRowHandlers(handlers, isWholeObject = false) {
        if (isWholeObject) {
            this.rowHandlers = handlers;
        } else {
            this.rowHandlers = {...this.rowHandlers, ...handlers};
        }
    }

    /**
     * 设置“表格-操作-事件响应”。例如：分页、表头筛选/排序
     * @param handler {function(pagination, filters, sorter, moreData: {currentDataSource: [{}]})}
     */
    setTableChangeHandler(handler) {
    }

    /**
     * 表格是否有变化
     * @return {boolean}
     */
    hadChanged() {
    }

    /**
     * 构建右键菜单
     */
    buildContextMenu() {
    }
}